package utils

import (
	"bufio"
	"fmt"
	"os"
)

type FileReader struct {
	FilePath string
	Content  []byte
}

// NewFileReader 创建新的文件读取器
func NewFileReader(path string) *FileReader {
	return &FileReader{
		FilePath: path,
	}
}

// ReadFullFile 读取整个文件内容
func (fr *FileReader) ReadFullFile() (string, error) {
	content, err := os.ReadFile(fr.FilePath)
	if err != nil {
		return "", fmt.Errorf("文件读取失败: %v", err)
	}
	fr.Content = content
	return string(content), nil
}

// ReadLines 逐行读取文件内容
func (fr *FileReader) ReadLines() ([]string, error) {
	file, err := os.Open(fr.FilePath)
	if err != nil {
		return nil, fmt.Errorf("文件打开失败: %v", err)
	}
	defer file.Close()

	var lines []string
	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		lines = append(lines, scanner.Text())
	}
	return lines, scanner.Err()
}

// CountLines 统计文件行数
func (fr *FileReader) CountLines() (int, error) {
	file, err := os.Open(fr.FilePath)
	if err != nil {
		return 0, err
	}
	defer file.Close()

	scanner := bufio.NewScanner(file)
	lineCount := 0
	for scanner.Scan() {
		lineCount++
	}
	return lineCount, scanner.Err()
}

func main() {
	// 示例用法
	reader := NewFileReader("e:/prjs/test_go/zh.txt")

	// 读取完整文件
	if content, err := reader.ReadFullFile(); err == nil {
		fmt.Println("完整内容:\n" + content)
	} else {
		fmt.Println("错误:", err)
	}

	// 逐行读取
	if lines, err := reader.ReadLines(); err == nil {
		fmt.Println("\n逐行内容:")
		for i, line := range lines {
			fmt.Printf("%d: %s\n", i+1, line)
		}
	}

	// 统计行数
	if count, err := reader.CountLines(); err == nil {
		fmt.Printf("\n总行数: %d", count)
	}
}
